5568
7037
Я случайно зафиксировал не те файлы в Git, но еще не отправил фиксацию на сервер.
Как я могу отменить эти коммиты из локального репозитория? 
1
2
3
следующий
Отменить фиксацию и повторить
$ git commit -m "Что-то ужасно неправильное" # (0: Ваша авария)
$ git reset HEAD ~ # (1)
<< редактировать файлы по мере необходимости >> # (2)
$ git add. # (3)
$ git commit -c ORIG_HEAD # (4)
Эта команда отвечает за отмену. Это отменит вашу последнюю фиксацию, оставив ваше рабочее дерево (состояние ваших файлов на диске) нетронутым. Вам нужно будет добавить их снова, прежде чем вы сможете снова зафиксировать их).
Внесите исправления в рабочие файлы дерева.
git добавьте все, что вы хотите включить в новый коммит.
Зафиксируйте изменения, повторно используя старое сообщение фиксации. reset скопировал старую голову в .git / ORIG_HEAD; коммит с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старого коммита и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать параметр -C.
В качестве альтернативы, чтобы отредактировать предыдущую фиксацию (или просто ее сообщение фиксации), commit --amend добавит изменения в текущем индексе к предыдущей фиксации.
Чтобы удалить (не возвращать) фиксацию, отправленную на сервер, необходимо переписать историю с помощью git push origin master --force.
Дальнейшее чтение
Как я могу переместить HEAD обратно в предыдущее место? (Отдельная голова) & Отменить коммиты
Приведенный выше ответ покажет вам git reflog, который вы можете использовать для определения SHA-1 для фиксации, к которой вы хотите вернуться. Получив это значение, используйте последовательность команд, как описано выше.
HEAD ~ совпадает с HEAD ~ 1. Статья Что такое HEAD в git? полезно, если вы хотите отменить несколько коммитов.
|
Отменить фиксацию немного страшно, если вы не знаете, как это работает. Но на самом деле это удивительно просто, если вы понимаете. Я покажу вам 4 различных способа отменить фиксацию.
вариант 1: git reset --hard
Допустим, у вас есть это, где C - ваша ГОЛОВКА, а (F) - состояние ваших файлов.
(F)
А-В-С
↑
мастер
Вы хотите удалить коммит C и больше никогда его не увидеть и потерять все изменения в локально измененных файлах. Ты делаешь это:
git reset --hard HEAD ~ 1
Результат:
(F)
А-Б
↑
мастер
Теперь B - ГОЛОВА. Поскольку вы использовали --hard, ваши файлы сбрасываются в свое состояние при фиксации B.
вариант 2: git reset
Ах, но предположим, что фиксация C не была катастрофой, а просто немного ошиблась. Вы хотите отменить фиксацию, но оставьте свои изменения для небольшого редактирования, прежде чем вы сделаете лучшую фиксацию. Начнем снова с C в качестве ГОЛОВКИ:
(F)
А-В-С
↑
мастер
Вы можете сделать это, не используя --hard:
git reset HEAD ~ 1
В этом случае результат:
(F)
А-В-С
↑
мастер
В обоих случаях HEAD - это просто указатель на последнюю фиксацию. Когда вы выполняете git reset HEAD ~ 1, вы говорите Git переместить указатель HEAD назад на одну фиксацию. Но (если вы не используете --hard) вы оставляете свои файлы такими, какими они были. Итак, теперь git status показывает изменения, которые вы отметили в C. Вы ничего не потеряли!
вариант 3: git reset --soft
Для легкого прикосновения вы даже можете отменить фиксацию, но оставить свои файлы и индекс:
git reset - мягкая ГОЛОВКА ~ 1
Это не только оставляет ваши файлы в покое, но и оставляет в покое ваш индекс. Когда вы выполните команду git status, вы увидите, что в индексе находятся те же файлы, что и раньше. Фактически, сразу после этой команды вы можете выполнить git commit и повторить только что сделанную фиксацию.
вариант 4: вы выполнили git reset --hard и вам нужно вернуть этот код
И еще одно: предположим, вы уничтожили фиксацию, как в первом примере, но потом обнаружили, что она вам все-таки нужна? Не повезло, правда?
Нет, еще есть способ вернуть его. Наберите git reflog, и вы увидите список (частичных) коммитов shas (то есть хэшей), которые вы переместили. Найдите коммит, который вы уничтожили, и сделайте следующее:
git checkout -b someNewBranchName shaYouDestroyed
Теперь вы воскресили этот коммит. На самом деле коммиты не уничтожаются в Git в течение примерно 90 дней, поэтому вы обычно можете вернуться и спасти тот, от которого не собирались избавляться.
|
Есть два способа «отменить» вашу последнюю фиксацию, в зависимости от того, сделали ли вы уже свою фиксацию общедоступной (отправленной в удаленный репозиторий):
Как отменить локальную фиксацию
Допустим, я совершил локальную фиксацию, но теперь я хочу удалить эту фиксацию.
git журнал
commit 101: bad commit # Последний коммит. Это будет называться «ГОЛОВА».
commit 100: good commit # Вторая после последней фиксации. Это то, что нам нужно.
Чтобы восстановить все до состояния до последней фиксации, нам нужно выполнить сброс до фиксации перед HEAD:
git reset --soft HEAD ^ # Используйте --soft, если хотите сохранить свои изменения
git reset --hard HEAD ^ # Используйте --hard, если вы не заботитесь о сохранении сделанных вами изменений
Теперь git log покажет, что наша последняя фиксация была удалена.
Как отменить публичную фиксацию
Если вы уже сделали свои коммиты общедоступными, вы захотите создать новый коммит, который «отменит» изменения, сделанные вами в предыдущем коммите (текущая HEAD).
git revert HEAD
Ваши изменения будут отмененыи готовы к совершению:
git commit -m 'восстановление случайно удаленного файла'
git журнал
commit 102: восстановление случайно удаленного файла
commit 101: удаление файла, который нам не нужен
commit 100: добавление нужного нам файла
Для получения дополнительной информации ознакомьтесь с Git Basics - Undoing Things.
|
Добавляйте / удаляйте файлы, чтобы добиться желаемого результата:
git rm classdir
git добавить источник
Затем измените фиксацию:
git commit --amend
Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет похоже на то, что вы вообще не совершали ошибки.
Обратите внимание, что вы должны делать это только в том случае, если вы еще не нажали. Если вы нажали, вам просто нужно зафиксировать исправление в обычном режиме.
|
git rm yourfiles / *. класс
git commit -a -m "удалил все файлы классов в папке 'yourfiles'"
или
git reset --hard HEAD ~ 1
Предупреждение. Приведенная выше команда навсегда удалит изменения в файлах .java (и любых других файлах), которые вы хотели зафиксировать.
Аппаратный сброс до HEAD-1 установит вашу рабочую копию в состояние фиксации перед ошибочной фиксацией.
|
Чтобы изменить последнюю фиксацию
Заменить файлы в индексе:
git rm --cached * .class
git добавить * .java
Затем, если это частная ветка, измените фиксацию:
git commit --amend
Или, если это общая ветка, сделайте новую фиксацию:
git commit -m 'Заменить файлы .class файлами .java'
(Чтобы изменить предыдущую фиксацию, используйте потрясающую интерактивную переадресацию.)
ProTip ™: добавьте * .class в gitignore, чтобы это не повторилось.
Чтобы отменить фиксацию
Изменение фиксации - идеальное решение, если вам нужно изменить последнюю фиксацию, но более общее решение сбрасывается.
Вы можете сбросить Git до любого коммита с помощью:
git reset @ ~ N
Где N - количество коммитов до HEAD, а @ ~ сбрасывается до предыдущего коммита.
Итак, вместо изменения фиксации вы можете использовать:
git reset @ ~
git добавить * .java
git commit -m "Добавить файлы .java"
Ознакомьтесь с git help reset, в частности с разделами --soft --mixed и --hard, чтобы лучше понять, что это делает.
Reflog
Если вы ошиблись, вы всегда можете использовать журнал ссылок, чтобы найти упавшие коммиты:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: переход к @ ~
2c52489 HEAD @ {1}: commit: добавлены файлы .class
$ git сбросить 2c52489
... и вы вернулись туда, откуда начали
|
Используйте git revert .
Чтобы получить идентификатор фиксации, просто используйте git log.
|
Если вы планируете полностью отменить локальную фиксацию, все, что вы изменили, вы сделали в фиксации, и если вас это ничего не беспокоит, просто выполните следующую команду.
git reset --hard HEAD ^ 1
(Эта команда проигнорирует всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией, как и после git add), выполните следующую команду.
git reset - мягкая ГОЛОВКА ^ 1
Теперь ваши зафиксированные файлы попадают в промежуточную область. Предположим, если вы хотите отложить файлы, потому что вам нужно отредактировать какой-то неправильный контент, выполните следующую команду
git сбросить HEAD
Теперь зафиксированные файлы должны поступать из подготовленной области в неустановленную. Теперь файлы готовы к редактированию, поэтому все, что вы меняете, вы хотите отредактировать, добавить и сделать новую / новую фиксацию.
Подробнее (ссылка не работает) (Архивная версия)
|
Если у вас установлен Git Extras, вы можете запустить команду git undo, чтобы отменить последнюю фиксацию. git undo 3 отменит последние три фиксации.
|
Я хотел отменить последние пять коммитов в нашем общем репозитории. Я нашел идентификатор ревизии, к которой хотел вернуться. Затем я ввел следующее.
подсказка> git reset --hard 5a7404742c85
HEAD сейчас по адресу 5a74047 Добавлена ​​еще одна страница в каталог
подсказка> git push origin master --force
Всего 0 (дельта 0), повторно используется 0 (дельта 0)
удаленный: bb / acl: neoneye разрешен. принятая полезная нагрузка.
На git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (принудительное обновление)
подсказка>
|
Я предпочитаю использовать git rebase -i для этой работы, потому что появляется хороший список, в котором я могу выбрать коммиты, от которых нужно избавиться. Возможно, это не так прямо, как некоторые другие ответы здесь, но это просто кажется правильным.
Выберите, сколько коммитов вы хотите перечислить, затем вызовите так (чтобы зарегистрировать последние три)
git rebase -i ГОЛОВКА ~ 3
Список образцов
выберите aa28ba7 Проверка работоспособности для порта RtmpSrv
выберите вариант версии c26c541 RtmpSrv
выберите 58d6909 Лучшая поддержка декодирования URL
Затем Git удалит коммиты для любой удаляемой строки.
|
Как исправить предыдущую локальную фиксацию
Используйте git-gui (или аналогичный), чтобы выполнить git commit --amend. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из фиксации. Вы также можете изменить сообщение фиксации.
Как отменить предыдущую локальную фиксацию
Просто сбросьте ветку в предыдущее место (например, с помощью gitk или git rebase). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном репозитории это будет похоже на то, что нежелательной фиксации никогда не было. Чтобы сделать все это одной командой, используйте git reset HEAD ~ 1.
словопредупреждения: неосторожное использование git reset - хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам в Git избегать этого, если они могут.
Как отменить публичную фиксацию
Выполните обратный выбор вишни (git-revert), чтобы отменить изменения.
Если вы еще не внесли другие изменения в свою ветку, вы можете просто сделать ...
git revert --no-edit HEAD
Затем отправьте обновленную ветку в общий репозиторий.
История коммитов покажет оба коммита по отдельности.
Дополнительно: Исправление частной ветки в публичном репозитории
Это может быть опасно - убедитесь, что у вас есть локальная копия ветки, которую нужно повторно запустить.
Также обратите внимание: вы не хотите этого делать, если над веткой может работать кто-то другой.
git push --delete (branch_name) ## удалить общедоступную версию ветки
Очистите ветку локально, а затем заново ...
git push origin (имя_ветки)
В нормальном случае вам, вероятно, не нужно беспокоиться о том, что история коммитов вашей частной ветки будет нетронутой. Просто нажмите на последующую фиксацию (см. «Как отменить публичную фиксацию» выше), а затем выполните сквош-слияние, чтобы скрыть историю.
|
Если вы хотите отменить его навсегда и клонировали какой-то репозиторий
Идентификатор фиксации можно увидеть
git журнал
Тогда вы можете сделать -
git reset --hard 
git push origin <имя_ответки> -f
|
Если вы совершили мусор, но не подтолкнули,
git reset - мягкая ГОЛОВКА ~ 1
HEAD ~ 1 - это сокращение от коммита перед головой. В качестве альтернативы вы можете обратиться к SHA-1 хэша, если хотите выполнить сброс. Параметр --soft удалит фиксацию, но оставит все ваши измененные файлы «Изменения, подлежащие фиксации», как сказал бы git status.
Если вы хотите избавиться от любых изменений в отслеживаемых файлах в рабочем дереве с момента фиксации перед заголовком, используйте вместо этого "--hard".
ИЛИ
Если вы уже нажали, а кто-то потянул, что обычно в моем случае, вы не можете использовать git reset. Однако вы можете сделать git revert,
git revert HEAD
Это создаст новую фиксацию, которая отменяет все, что было внесено случайной фиксацией.
|
В SourceTree (графический интерфейс для GitHub) вы можете щелкнуть фиксацию правой кнопкой мыши и выполнить «Обратную фиксацию». Это должно отменить ваши изменения.
На терминале:
В качестве альтернативы вы можете использовать:
git revert
Или:
git reset --soft HEAD ^ # Используйте --soft, если вы хотите сохранить свои изменения.
git reset --hard HEAD ^ # Используйте --hard, если вы не заботитесь о сохранении ваших изменений.
|
Одна команда:
git reset --soft 'HEAD ^'
Отлично работает, чтобы отменить последнюю локальную фиксацию!
|
Просто сбросьте его, выполнив команду ниже, используя git:
git reset - мягкая ГОЛОВКА ~ 1
Объясните: что делает git reset, он в основном сбрасывается до любого коммита, к которому вы хотите вернуться, затем, если вы объедините его с ключом --soft, он вернется, но сохраните изменения в ваших файлах, поэтому вы вернетесь на этап, на котором был только что добавлен файл, HEAD - это голова ветки, и если вы объедините с ~ 1 (в этом случае вы также используете HEAD ^), он вернется только к одной фиксации, которую вы хотите. ..
Я создаю шаги на изображении ниже более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях, и фиксацию кода:
|
Как отменить последний коммит Git?
Чтобы восстановить все, как было до последней фиксации, нам нужно выполнить сброс до фиксации перед HEAD.
Если вы не хотите сохранять внесенные вами изменения:
git reset --hard HEAD ^
Если вы хотите сохранить изменения:
git reset - мягкая ГОЛОВКА ^
Теперь проверьте свой журнал git. Это покажет, что наша последняя фиксация была удалена.
|
"Сбросить рабочее дерево до последней фиксации"
git reset --hard HEAD ^
«Очистить неизвестные файлы из рабочего дерева»
git clean
см. - Краткий справочник Git
ПРИМЕЧАНИЕ. Эта команда удалит вашу предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard безопаснее.
|
Используйте reflog, чтобы найти правильное состояние
git reflog
РЕФЛОГ ПЕРЕД СБРОСОМ
Выберите правильный журнал ссылок (в моем случае - f3cb6e2) и введите
git reset --hard f3cb6e2
После этого HEAD репо будет сброшен на этот HEADid
ЖУРНАЛ ПОСЛЕ СБРОСА
Наконец, рефлог выглядит как на картинке ниже
РЕФЛОГ ФИНАЛ
|
Первый забег:
git reflog
Он покажет вам все возможные действия, которые вы выполнили в своем репозитории, например, фиксацию, слияние, извлечение и т. Д.
Затем сделайте:
git reset --hard ActionIdFromRefLog
|
Отменить последнюю фиксацию:
git reset --soft HEAD ^ или git reset --soft HEAD ~
Это отменит последнюю фиксацию.
Здесь --soft означает возврат к постановке.
HEAD ~ или HEAD ^ означает перейти к фиксации перед HEAD.
Заменить последнюю фиксацию на новую:
git commit --amend -m "сообщение"
Он заменит последнюю фиксацию на новую.
|
По-другому:
Проверьте ветку, которую вы хотите вернуть, затем сбросьте локальную рабочую копию обратно на фиксацию, которую вы хотите сделать последней на удаленном сервере (все, что после нее, будет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Reset BRANCHNAME to this commit».
Затем перейдите в локальный каталог вашего репозитория и выполните эту команду:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEФИЛИАЛ: ФИЛИАЛ
Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой одной ветки.
|
Введите git log и найдите последний хэш-код фиксации, а затем введите:
git reset <предыдущая команда>
|
В моем случае я случайно зафиксировал некоторые файлы, которые не хотел. Итак, я сделал следующее, и это сработало:
git reset - мягкая ГОЛОВКА ^
git rm --cached [файлы, которые вам не нужны]
git add [нужные файлы]
git commit -c ORIG_HEAD
Проверьте результаты с помощью gitk или git log --stat
|
Просто запустите это в командной строке:
git reset - мягкая ГОЛОВКА ~
|
Есть два основных сценария
Вы еще не нажали коммит
Если проблема заключалась в добавленных вами дополнительных файлах (и они не нужны вам в репозитории), вы можете удалить их с помощью git rm, а затем выполнить коммит с помощью --amend
git rm 
Вы также можете удалить целые каталоги с помощью -r или даже объединить с другими командами Bash
git rm -r <путь к каталогу>
git rm $ (найти -name '* .class')
После удаления файлов вы можете выполнить фиксацию с параметром --amend
git commit --amend -C HEAD # параметр -C должен использовать то же сообщение фиксации
Это перепишет вашу недавнюю локальную фиксацию, удалив лишние файлы, поэтому эти файлы никогда не будут отправлены на push, а также будут удалены GC из вашего локального репозитория .git.
Вы уже нажали коммит
Вы можете применить то же решение из другого сценария, а затем выполнить git push с параметром -f, но это не рекомендуется, поскольку он перезаписывает удаленную историю с расходящимся изменением (это может испортить ваш репозиторий).
Вместо этого вы должны выполнить фиксацию без --amend (помните это о -amend`: эта опция перезаписывает историю последней фиксации).
|
Для локального коммита
git reset - мягкая ГОЛОВКА ~ 1
или если вы точно не помните, в какой это фиксации, вы можете использовать
git rm --cached <файл>
Для принудительной фиксации
Правильный способ удаления файлов из истории репозитория - использовать git filter-branch. То есть,
git filter-branch --index-filter 'git rm --cached <файл>' HEAD
Но я рекомендую вам использовать эту команду осторожно. Подробнее читайте на странице руководства git-filter-branch (1).
|
Чтобы вернуться к предыдущей версии с окончательным удалением всех незафиксированных изменений:
git reset --hard HEAD ~ 1
|
ЧТО ИСПОЛЬЗОВАТЬ, сбросить --soft или reset --hard?
Я просто добавляю два цента за ответ @ Kyralessa:
Если вы не знаете, что использовать, выберите --soft (я использовал это соглашение, чтобы запомнить его --soft для безопасности).
Зачем ?
Если вы выберете --hard по ошибке, вы ПОТЕРЯЕТЕ свои изменения, как не было раньше.
Если вы по ошибке выбрали --soft, вы можете добиться тех же результатов, что и --hard, применив дополнительные команды
git сбросить HEAD file.html
git checkout - file.html
Полный пример
echo "некоторые изменения ..."> file.html
git добавить file.html
git commit -m "неправильная фиксация"
# Мне нужно сбросить
git reset --hard HEAD ~ 1 (отменить изменения)
# ИЛИ
git reset --soft HEAD ~ 1 # Вернуться к постановке
git reset HEAD file.html # вернуться в рабочий каталог
git checkout - file.html # отменить изменения
Кредиты принадлежат @Kyralessa.
|
1
2
3
следующий
Весьма активный вопрос. Заработайте 10 репутации, чтобы ответить на этот вопрос. Требование репутации помогает защитить этот вопрос от спама и отсутствия ответов.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с меткой git version-control git-commit undo или задайте свой вопрос.